package com.hmc.modules.sjfx.util;

import org.apache.commons.math3.stat.Frequency;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Apache Commons Math 频率工具类
 */
public class FrequencyUtil {
    /**
     * values 排序去重
     */
    public static List<Double> sortAndDistinct(List<Double> values) {
        // 校验输入的列表不为空且不含null元素
        if (values == null || values.contains(null)) {
            // 如果输入不合法，返回一个空列表
            return Collections.emptyList();
        }
        // 对输入的列表进行排序
        List<Double> sortedValues = new ArrayList<>(values);
        Collections.sort(sortedValues);
        // 对排序后的列表进行去重
        List<Double> distinctValues = new ArrayList<>();
        for (Double value : sortedValues) {
            if (!distinctValues.contains(value)) {
                distinctValues.add(value);
            }
        }
        return distinctValues;
    }

    /**
     * 样本的基本统计量。
     * @param values 样本数据列表
     */
    public static Frequency calculateStatistics(List<Double> values) {
        Frequency stats = new Frequency();
        for (Double value : values) {
            stats.addValue(value);
        }
        return stats;
     }

    /**
     * 为 values 生成概率分布曲线数据点列表。
     *
     */
    public static List<Double> generateProbabilityDistributionCurve(List<Double> values) {
        // 校验输入的列表不为空且不含null元素
        if (values == null || values.contains(null)) {
            // 如果输入不合法，返回一个空列表
            return Collections.emptyList();
        }
        Frequency stats = calculateStatistics(values);

        List<Double> doubles = ListUtil.sortAndDistinct(values);

        System.out.println("========================================="+doubles);
        System.out.println("========================================="+stats);

        ArrayList<Double> glfb = new ArrayList<>();

        doubles.forEach(value -> {
//            System.out.println(value + " : " + stats.getPct(value));
            glfb.add((double) stats.getCount(value));
        });

        return glfb;
    }
}
